<template>
  <wd-input
    type="digit"
    v-model="internalValue"
    @input="handleInput"
    @blur="handleBlur"
    :placeholder="placeholder"
    :disabled="disabled"
    v-bind="$attrs"
  />
</template>
  
  <script setup>
import { ref, watch, defineProps, defineEmits, computed } from 'vue'

// 组件属性定义
const props = defineProps({
  // 双向绑定值
  modelValue: {
    type: [String, Number],
    default: '',
  },
  // 占位符
  placeholder: {
    type: String,
    default: '请输入数字',
  },
  // 整数部分最大位数（0表示不限制）
  maxIntegerDigits: {
    type: Number,
    default: 0,
  },
  // 小数部分最大位数（0表示不允许小数）
  maxDecimalDigits: {
    type: Number,
    default: 2,
  },
  // 最小值限制
  min: {
    type: Number,
    default: -Infinity,
  },
  // 最大值限制
  max: {
    type: Number,
    default: Infinity,
  },
  // 是否禁用
  disabled: {
    type: Boolean,
    default: false,
  },
})

// 事件定义（同步值和触发校验状态）
const emit = defineEmits(['update:modelValue', 'validate'])

// 内部维护的输入值
const internalValue = ref(
  typeof props.modelValue === 'number' ? String(props.modelValue) : props.modelValue,
)

// 监听父组件值变化，同步到内部
watch(
  () => props.modelValue,
  (newVal) => {
    internalValue.value = typeof newVal === 'number' ? String(newVal) : newVal
  },
)

// 处理输入逻辑
const handleInput = () => {
  console.log('1111111111111111')
  if (props.disabled) return
  let value = internalValue.value.trim()

  // 1. 过滤非数字和非小数点（允许负数）
  value = value.replace(/[^\d.-]/g, '')
  // 2. 确保只有一个负号且在开头
  value = value.replace(/(.)-+/g, '$1').replace(/-{2,}/g, '-')
  if (value.indexOf('-') > 0) value = value.replace(/-/g, '')
  // 3. 只保留一个小数点
  value = value.replace(/\.{2,}/g, '.')
  // 4. 处理小数点位置（负数时小数点在负号后）
  if (value.startsWith('-.')) value = '-0.'
  if (value === '.') value = '0.'
  if (value === '-') value = ''

  // 5. 限制整数部分位数
  if (props.maxIntegerDigits > 0) {
    const [integerPart, decimalPart] = value.split('.')
    if (integerPart) {
      const pureInteger = integerPart.replace(/-/g, '') // 去除负号后计算长度
      if (pureInteger.length > props.maxIntegerDigits) {
        // 截断整数部分超出的位数
        const truncated = pureInteger.slice(0, props.maxIntegerDigits)
        value = decimalPart
          ? `${integerPart.startsWith('-') ? '-' : ''}${truncated}.${decimalPart}`
          : `${integerPart.startsWith('-') ? '-' : ''}${truncated}`
      }
    }
  }

  // 6. 限制小数部分位数
  if (props.maxDecimalDigits === 0) {
    // 不允许小数，直接移除小数点及后面内容
    value = value.split('.')[0]
  } else if (props.maxDecimalDigits > 0) {
    // 限制小数位数
    value = value.replace(new RegExp(`(\\.\\d{${props.maxDecimalDigits}})\\d+`, 'g'), '$1')
  }
  nextTick(() => {
    // 更新内部值并同步给父组件
    internalValue.value = value
    emit('update:modelValue', value || '')
  })
}

// 失去焦点时校验最大值和最小值
const handleBlur = () => {
  if (!internalValue.value) {
    emit('validate', { valid: true, value: null })
    return
  }

  const num = Number(internalValue.value)
  let valid = true
  let message = ''

  if (num < props.min) {
    valid = false
    message = `不能小于最小值${props.min}`
    internalValue.value = String(props.min)
    emit('update:modelValue', String(props.min))
  } else if (num > props.max) {
    valid = false
    message = `不能大于最大值${props.max}`
    internalValue.value = String(props.max)
    emit('update:modelValue', String(props.max))
  }

  emit('validate', { valid, value: num, message })
}
</script>